ヤマムギ

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認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

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

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

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

 - Java, study , ,

  関連記事

JAWS DAYS 2018 振り返り(特にコミュニティフレンドシップ)

JAWS DAYS 2018を振り返りたいと思います。 やったこと コミュニティ …

「JAWS-UG佐賀 3年ぶり!re:Bootするよ!」に参加しました

全員自己紹介からスタートしました。 さくさくっとマイクをまわしてなんと10分まき …

DevLOVE関西「プログラミングを楽しく続けるための健康Hack」に行ってきました

DevLOVE関西「プログラミングを楽しく続けるための健康Hack」に行ってきま …

AWS Summit 2016 Tokyoに参加してきました (Day2)

馬込は非常に良い天気です。 泊まっている部屋が2Fでしたので窓を明けると歩いてい …

JAWS-UG北陸新幹線 ( 福井開催 )に参加しました

福井駅前で、JAWS-UG北陸新幹線が開催されましたので参加しました! 大阪駅か …

「JAWS-UG朝会 #18」で主にAWSなブログについて発表をしました

ラジオ体操 いつものラジオ体操から。 今日はラーニングセンターから配信の日でした …

「AWS Expert Online 13 / JAWS-UG浜松 AWS勉強会 2021#1」に参加しました

本日のAWS Expert Onlineのテーマは「今日から始める、イベントドリ …

AWS認定オンライン受験をしてみました(OnVUE)

本日2020年5月28日より、AWS認定試験のオンライン受験が、日本国内でも可能 …

DevLOVE関西「事業会社の現場を知ろう~モノタロウ編~」に行ってきました

DevLOVE関西「事業会社の現場を知ろう~モノタロウ編~」 モノタロウさんプラ …

「JAWS-UG 名古屋 DR対策特集+LT」で発表しました

2021/3/29の「JAWS-UG 名古屋 DR対策特集+LT」で「ブログを大 …