ヤマムギ

growing hard days.

*

Java SE 7 Silver 試験対策セミナーで模擬問題の解説をマークダウンでメモってみた

      2015/03/29

Java SE 7 Silver 試験対策セミナーに行って、模擬問題にチャレンジしてきました。
問題の解説をAtomを使ってマークダウンでメモしてたので、JetPack Markdownを使ってそのまま記事にしてみました。
※あくまでもメモなので、なんとなくで読んでもらえば幸いです。

スコープ

[java]
package ken;

class Target{
public String name = "hello";
}
[/java]

  • nameはkenパッケージ内のすべてのクラスが直接アクセスして編集可能
アクセス修飾子 クラス コンストラクタ メンバ変数 メソッド 説明
public o o o o どのクラスからでも
protected x o o o このクラスを継承したサブクラス、もしくは同一パッケージ内のクラスから
デフォルト(指定なし) o o o o 同一パッケージ内のクラスからのみ
private x o o o 同一クラス内からのみ

※リフレクションを使用した場合を除く

[java]
package util;
public class BuiltUtils{
private static void process(byte[] b){
}
}
[/java]

[java]
package app;
public class someApp{
public static void main(String[] args){
byte[] bytes = new byte[256];
}
}
[/java]

  • BitUtilsクラスのprocessメソッドはアクセス修飾子がpraivateなのでSomeAppクラスからは使用できない

継承と修飾子

[java]
class ClassA{
public int numberOfInstances;
protected ClassA(int numberOfInstances){
this.numberOfInstances = numberOfInstances;
}
}

public class ExtendedA extends ClassA {
private ExtendedA(int numberOfInstances){
super(numberOfInstances);
}
public static void main(String[] args){
ExtendedA ext = new ExtendedA(420);
System.out.println(ext.numberOfInstances);
}
}
[/java]

  • サブクラスExtendedAで明示的にスーパークラスClassAの引数1つのコンストラクタを呼び出しているのでエラーにはならない。
  • コンストラクタにはpublic,protected,privateなどすべてのアクセス修飾子を指定可能
  • private ExtendedAコンストラクタは自クラス内からしか参照できない。ExtendedA extは自クラス内なのでOK
  • protected ClassAコンストラクタは同じパッケージかこのクラスを継承したクラスからしか参照できない。super(numberOfInstances)はサブクラスなのでOK。

[java]
public interface A4 {
public void doSomething(String thing);
}

class AImpl implements A4{
public void doSomething(String thing){}
}

class B4{
public A4 doit(){

}

class C4 extends B4{
public AImpl doit(){

}
[/java]

  • class C4のpublic Object execute()でコンパイルエラーとなる
  • クラスBのexecute()メソッドをオーバーライドしようとしているが戻り値がStringではなくObjectになっている
  • メッソドのオーバーライドを行う際、戻り値はスーパークラスの同名メソッドと同じかサブクラスでないとならない

[java]
public interface A111{
String s = “yo”;
public void mehod1();
}

interface B{}

interface C extends A111,B{
public void method1();
public void method1(int x);
}
[/java]

  • インターフェースは多重継承ができるのでOK(クラスはNG)
  • interface C のmethod1()は同じpublic(公開範囲は狭くなっていない)なので問題ない
  • interface C のmethod1(int x)は新たに抽象メソッドを定義しているだけ
  • String s=”yo”はインターフェース内の変数宣言なのでコンパイル時に暗黙的に定数扱い(public static final)となる

[java]
abstract public class Employee{
protected abstract double getSalesAmount();
public double getCommission(){
return getSalesAmount() * 0.15;
}
}

class Sales extends Employee{
public double getSalesAmount(){return 123.45;}
}
[/java]

  • Employee.getSalesAmount()メソッドのアクセス修飾子はprotected
  • protectedよりも狭くない公開範囲のprotected,publicであればOK
  • private,修飾子なしはNG

[java]
interface Data{public void load();}
abstract class Info{public abstract void load();}
[/java]

[java]
public class Employee extends Info implements Data{
public void load(){/* do something */}
}
[/java]

  • extends(クラスの継承)とimplements(インターフェース)ではextends(クラスの継承)を先に記載する
  • 抽象クラス.メソッド,インターフェース.メソッドといった書き方はない

コンストラクタ

[java]
public class Hello {
String title;
int value;
public Hello(){
title += ” World”;
}
public Hello(int value){
this.value=value;
title=”Hello”;
Hello();
}
}

class TesterHello{
public static void main(String[] args){
Hello c=new Hello(5);
System.out.println(c.title);
}
}
[/java]

  • Hello();でコンパイルエラーとなる
  • 引数ありのコンストラクタから自クラスのコンストラクタを通常のメソッドのように呼び出す事はできない
  • 上記の中で呼び出す場合はthis();をpublic Hello(int value){のすぐ後で呼び出す必要がある

[java]
public class Planet{
private String name;
public Planet(String name){
this.name = name;
}
public String getName(){
return name;
}
}
[/java]

[java]
public class Tree extends Planet{
public void growFruit(){}
public void drawLeaves(){}
}
[/java]

  • Treeクラスにはコンストラクタがないのでコンパイル時に引数のないコンストラクタが生成される
  • TreeクラスはPranetクラスのサブクラスなので最初にsuper(引数)がない場合、自動的にスーパークラスのデフォルトコンストラクタが実行される
  • Planetクラスには引数ありのコンストラクタがあるので、引数なしのデフォルトコンストラクタが生成されないのでコンパイルエラーとなる
  • なので、PlanetクラスにPublic Planet(){this(“fern”)}などを追加すればコンパイルできる

[java]
class Person{
String name = “No name”;
public Person(String nm){
name = nm;
}
}

class Employee extends Person{
String empID = “0000”;
public Employee(String id){
empID = id;
}
}

public class EmployeeTest{
public static void main(String[] args){
Employee e = new Employee(“4321”);
System.out.println(e.empID);
}
}
[/java]

  • Employeeクラスのコンストラクタ内でコンパイルエラーとなる
  • EmployeeクラスはPersonクラスのサブクラス
  • Employeeクラスでは明示的なスーパークラスのコンストラクタ呼び出しがないのでPersonクラスのデフォルトコンストラクタPerson()が呼び出される
  • Personクラスには引数ありのコンストラクタを書いてしまっているのでデフォルトコンストラクタPerson()が生成されない
  • Employeeクラスのコンストラクタの最初でsuper(id);のように呼びだせばOK

[java]
class Employee{
String name;
double baseSalary;
Employee(String name,double baseSalary){
this.name = name;
this.baseSalary = baseSalary;
}
}

public class SalesPerson extends Employee{
double commission;
public SalesPerson(String name,double baseSalary,double commission){
//insert code
}
}
[/java]

  • SalesPersonクラスのコンストラクタ内でコンパイルエラーとなる
  • SalesPersonクラスはEmployeeクラスのサブクラス
  • SalesPersonクラスでは明示的なスーパークラスのコンストラクタ呼び出しがないのでEmployeeクラスのデフォルトコンストラクタEmployee()が呼び出される
  • Employeeクラスには引数ありのコンストラクタが定義されてしまっているのでデフォルトコンストラクタが生成されない
  • SalesPersonクラスのコンストラクタの最初でsuper(name,baseSalary);のように呼び出せばOK

例外

[java]
class A{
public void method1(){
B b = new B();
b.method2();
System.out.println(“class A”);
}
}

class B{
public void method2(){
C c = new C();
c.method3();
System.out.println(“class B”);
}
}

class C{
public void method3(){
String nullStr=null;
System.out.println(nullStr.length());
}
}

public class tryTest {
public static void main(String[] args){

[/java]

  • NullPointerExceptionは非チェック例外なのでメソッドにthrowsの指定がなくても必ず呼び出し元に送出される。
  • なので、an error occurredが表示される

[java]
public class A2 {
void foo() throws Exception{
throw new Exception();
}
}

class SubB2 extends A2{
void foo(){
System.out.println(“B “);
}
}

class Tester{
public static void main(String[] args){
A2 a = new SubB2();
a.foo();
}
[/java]

  • throws句があるのに例外処理がないからコンパイルエラーとなる
  • throws句はサブクラスで指定しなくてもオーバーライドされる

[java]
public class A3 {
public void method1(){
try{
B3 b=new B3();
b.method2();
}catch(TestException te){
throw new RuntimeException(te);
}
}
}

class B3{
public void method2() throws TestException{

}

class Tester3{
public void method(){
A3 a = new A3();
a.method1();
}
}

public class TestException extends Exception{

}
[/java]

  • 非チェック例外はコンパイル時にチェックされない
  • チェック例外はコンパイルエラーになる
  • method1()はRuntimeExceptionをthrowしている
  • RintimeExceptionは非チェック例外、なので呼び出し元で例外処理がなくてもいい
  • TestExceptionはExceptionのサブクラスとして作ったものなので例外処理が必要

キャスト

[java]
public class Base1 {
public static final String FOO = “foo”;
public static void main(String[] args){
Base1 b = new Base1();
Sub1 s = new Sub1();
System.out.print(Base1.FOO);
System.out.print(Sub1.FOO);
System.out.print(b.FOO);
System.out.print(s.FOO);
System.out.print(((Base1)s).FOO);
}
}

class Sub1 extends Base1{
public static final String FOO = “bar”;
}
[/java]

  • ((Base1)s).FOOはクラス変数sをキャストしてBASE1型にしているので、BASE1クラスのFOO変数の”foo”が表示される。

[java]
Object[] myObject = {new Integer(12),
new String(“foo”),
new Integer(2),
new Boolean(true)};

Arrays.sort(myObject);
[/java]

  • Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringが発生する
  • Arrays.sortでArraysにキャストしようとしてExceptionが発生
  • Arraysは基本データ型(Integer,BooleanはOK)しか扱えない
  • Stringは参照型

[java]
public class TestString1{
public static void main(String[] args){
String str = “420”;
str += 42;
System.out.println(str);
}
}
[/java]

  • ストリング変数strに数字42を+=演算子で加えた結果strは42042となる

ループとラベル

[java]
public class Breaker2 {
static String o= “”;
public static void main(String[] args){

}
}
[/java]

  • 出力は24
  • continueは処理を1週とばす
  • break zはzラベルのついたfor文を終了する

カプセル化

[java]
public class FoobarCard{
private String CardID;
private Integer limit;
public String ownerName;

public void setCardInformation(String cardID,String ownerName,Integer limit){
this.cardID = cardID;
this.limit = limit;
this.ownerName = ownerName;
}
}
[/java]

  • 属性と操作を一体化させて表現することをカプセル化と呼ぶ
  • 実データであるインスタンス変数が他クラスからむやみに変更される事を防ぐために一般的にインスタンス変数はprivate指定が推奨
  • メソッドはpublic指定が推奨
  • public指定されているownerName変数がカプセル化を破壊しているといえる

最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - Java, study , ,

ad

ad

  関連記事

Developers Summit 2024「GitHub Copilotは開発者の生産性をどれだけ上げるのか? ZOZOでの全社導入とその効果」を見ました

株式会社ZOZO 技術本部 技術戦略部 CTOブロック テックリード 堀江 亮介 …

EC-CUBE3.0 コードリーディング勉強会第1回目に行ってきました

EC-CUBE3.0 コードリーディング勉強会第1回目に行ってきました。 ECサ …

「kintone Café 大阪 Vol.8 〜夏の事例祭り!〜」に行ってきました

「kintone Café 大阪 Vol.8 〜夏の事例祭り!〜」に行ってきまし …

Developers Summit 2018 「事例2本立て!Redmineユーザ達が語る現場定着化への取組みと導入アンチパターン」を聞きました

以下は、思ったことや気になったことをメモしていますので、必ずしも登壇者の発表内容 …

AKIBA.AWS ONLINE #05 – AWSスキルアップ編で発表しました

AKIBA.AWS ONLINE #05 – AWSスキルアップ 編に発表参加し …

「MonotaRo Tech #3 テスト自動化」に行ってきました

モノタロウさんの「MonotaRo Tech #3 テスト自動化」に行ってきまし …

DevLOVE関西 現場甲子園2015 「西日本大会」に行ってきました

DevLOVE関西 現場甲子園2015 「西日本大会」に行ってきました。 全部で …

Innovation EGG 第8回 『可視化・課題と支える技術』に行ってきました

Innovation EGG 第8回 『可視化・課題と支える技術』に行ってきまし …

Alexa Day 2018にサポーターの中の人として(初)参加しました

2018/2/11に神戸三ノ宮のスペースアルファ三宮で開催されたAlexa Da …

Innovation EGG 第9回 『ITの可能性と楽しさを語ろう!』に行ってきました

JAZUG LINE 砂金さん OracleからMSからLINEへ 何にわくわく …